<!DOCTYPE html>
<html lang="en">
<head>
    <meta charset="UTF-8">
    <meta http-equiv="X-UA-Compatible" content="IE=edge">
    <meta name="viewport" content="width=device-width, initial-scale=1.0">
    <title>Document</title>
</head>
<body>
    <script>
        // 作用域 ： 一、全局 二、局部（函数作用域）;
        // 一、全局直接定义或者声明的变量和函数 

        // var a  = 10;
        // function fn(){
        //     console.log("fn");
        // }

        // window 是js里的一个顶级全局对象，多数情况下可以省略;
        // console.log(a);
        // console.log(window.a);
        // console.log(window);
        // console.log(window.document);
        // console.log(window.fn);

        // 二、局部作用域 ： 函数作用域  函数里大括号包裹的区域
        // function fn(){
        //     var a = 10;
        //     console.log(a);
        // }
        // fn();

        // 三、在局部作用域里变量的访问规则： 局部作用域可以访问 外层的变量 ，不能访问内层变量

        // 全局作用域（默认的）----> out函数作用域 ----> inner函数作用域 
        // var a = 10;
        // function out(){
        //     console.log(a)
        //     function inner(){
        //         console.log(a)
        //     }
        //     inner();
        // }
        // out();
        // var a = 20;
        // function fn1(){
        //     console.log("fn1的作用域")
        //     console.log(a);
        //     // console.log(b);
        //     return function(){
        //         // var b = 10;
        //         console.log(a);
        //         // 第一个返还函数的作用域
        //         return function(){
        //             console.log(a);
        //             // 第二个返还函数的作用域

        //         }
        //     }
        // }

        // fn1()()();

        // 四、局部作用域的赋值规则 : 局部作用域 如果没有声明 那么会向上不停的赋值，直到赋值成全局变量为止；


        // var a  = 10;
        // console.log(a);
        // var a;
        // a = 10;
        // console.log(a);
        // var a,b,c;
        // a = 10;
        // b = 20;
        // c = 30;

        // 可以使用的 ，但是不规范
        // a = 10;
        // console.log(a);

        // function fn(){
        //     // 如果没有声明 那么会自定提升成全局变量
        //     a = 10;
        //     console.log(a);
        // }

        // fn();
        // console.log(a);


        // 全局变量和局部变量，局部变量用的多 ，模块区分局部变量
        // 全局变量如果定义过多 ，变量的污染 

        function fn1(){
            function fn2(){
                function fn3(){
                    a  = 10;  // 变量的赋值规则 ： 会不停的向上层作用域赋值，直到变成全局变量，不推荐这样写 ；
                }
                fn3();
                console.log(a);
            }
            fn2();
            console.log(a);
        }
        fn1();
        console.log(a);
        






    </script>
</body>
</html>